package com.java.aop.test;

import com.java.aop.inter.Calculator;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * 代理对象的类
 */
public class CalculatorProxy {
    /**
     *
     * @param calculator  被代理的对象
     * @return
     */
    public static Calculator getProxy(Calculator calculator) {

        /**
         *     Object proxy    代理对象，给JDK使用
         *     Method method   当前将要执行的目标对象方法
         *     Object[] args   这个方法调用时候外界传入的参数
          */
        InvocationHandler h = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = null;
                try {
                    System.out.println("【"+method.getName()+"】方法开始执行了,使用的参数列表是" + "[" + Arrays.asList(args) + "]");
                    result = method.invoke(calculator, args);
                    System.out.println("【"+method.getName() +"】方法执行完成,计算的结果是：" + result);
                }catch (Exception e){
                    System.out.println("【"+method.getName()+"】方法执行出现了异常,异常信息是：" + e.getMessage());
                }finally {
                    System.out.println("【"+method.getName()+"】方法执行完成");
                }
                return result;
            }
        };
        //这个接口实现了那些类
        Class<?>[] interfaces = calculator.getClass().getInterfaces();
        //类加载器
        ClassLoader loader = calculator.getClass().getClassLoader();
        Object proxy = Proxy.newProxyInstance(loader, interfaces, h);
        return (Calculator) proxy;
    }
}
